package DynamicProgrammingPackage;

public class maxProfitIII_ {
    // 1. dp[i][0]表示在第i天不进行操作,
    // dp[i][1]表示在第i天第一次持有股票
    // dp[i][2]表示在第i天第一次不持有股票
    // dp[i][3]表示在第i天第二次持有股票
    // dp[i][4]表示在第i天第二次不持有股票
    // 持有股票可能是买入, 也有可能是之前买入股票保持

    // 2. 递推公式:
    // dp[i][0] = dp[i - 1][0]
    // dp[i][1] = Math.max(dp[i - 1][0],dp[i - ][0] - prices[i])
    // dp[i][2] = Math.max(dp[i - 1][2],dp[i - 1][1] + prices[i])
    // dp[i][3] = Math.max(dp[i - 1][3],dp[i - 1][2] - prices[i])
    // dp[i][4] = Math.max(dp[i - 1][4],dp[i - 1][3] + prices[i])
    public int maxProfit(int[] prices) {
        int[][] dp = new int[prices.length][5];
        dp[0][0] = 0;
        dp[0][1] = -prices[0];
        dp[0][2] = 0;
        dp[0][3] = -prices[0];
        dp[0][4] = 0;
        for (int i = 1; i < prices.length; i++) {
            dp[i][1] = Math.max(dp[i - 1][0],dp[i - 1][0] - prices[i]);
            dp[i][2] = Math.max(dp[i - 1][2],dp[i - 1][1] + prices[i]);
            dp[i][3] = Math.max(dp[i - 1][3],dp[i - 1][2] - prices[i]);
            dp[i][4] = Math.max(dp[i - 1][4],dp[i - 1][3] + prices[i]);
        }
        return dp[prices.length - 1][4];
    }
}
